#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>


int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        //child;
        int cnt = 5;
        while(cnt)
        {
            printf("I am child,pid: %d,cnt: %d\n",getpid(),cnt);
            cnt--;
            sleep(2);
        }
        exit(0);
    }
    //father
    while(1)
    {
        int status = 0;
        pid_t rid = waitpid(id,&status,WNOHANG);
        if(rid>0)
        {
            printf("child quit success,exit code:%d,exit signal:%d\n",(status>>8)&0xff,status&0x7f);
            break;
        }
        else if(rid == 0) 
        {
            printf("child is alive,wait agin,fater do other thing...\n");
        }
        else if(rid <0)
        {
            printf("wait failed\n");
            break;
        }
        sleep(1);
    }   

    return 0;
}

//int main()
//{
//    pid_t id = fork();
//    if(id == 0)
//    {
//        //child
//        int cnt = 5;
//        while(cnt)
//        {
//            printf("I am child,pid: %d,cnt: %d\n",getpid(),cnt);
//            cnt--;
//        }
//        exit(5);//让子进程退出码为5
//    }
//    else 
//    {
//        //father
//        int status = 0;
//        wait(&status);
//        printf("wait child success,exit code:%d,exit signal:%d\n",(status>>8)&0xff,status&0x7f);
//    }
//    return 0;
//}





//进程地址空间

//int un_gval;
//int init_gval=100;
//  
//int main(int argc, char* argv[],char* env[])
//{
//    //代码区
//    printf("code addr: %p\n",main);
//    //字符常量区
//    const char *str = "hello Linux";
//    //*str = 'h';//不能修改因为字符常量区是被写入到代码区的，而代码区不能被修改
//    printf("read only char addr: %p\n",str);
//    //已初始化全局变量区
//    printf("init global value addr: %p\n",&init_gval);
//    
//    //所谓的静态区就是已初始化全局变量区
//    static int a ;   
//    printf("static addr: %p\n",&a);
//
//    //已初始化全局变量区
//    printf("uninit global value addr: %p\n",&un_gval);
//    //堆区
//    char *heap1 = (char*)malloc(100);
//    char *heap2 = (char*)malloc(100);
//    char *heap3 = (char*)malloc(100);
//    char *heap4 = (char*)malloc(100);
//    char *heap5 = (char*)malloc(100);            
//    printf("heap1 addr: %p\n",heap1);//向地址增大方向增长    
//    printf("heap2 addr: %p\n",heap2);    
//    printf("heap3 addr: %p\n",heap3);    
//    printf("heap4 addr: %p\n",heap4);    
//    printf("heap5 addr: %p\n",heap5);                                                                                                                   
//    //栈区                 
//    printf("stack1 addr: %p\n",&heap1);    
//    printf("stack2 addr: %p\n",&heap2);
//    printf("stack3 addr: %p\n",&heap3);    
//    printf("stack4 addr: %p\n",&heap4);   
//    printf("stack5 addr: %p\n",&heap5);
//
//    //命令行参数
//    int i = 0;
//    for(;argv[i];i++)
//    {
//        printf("argv[%d]:%p\n",i,argv[i]);
//    }
//    //环境变量
//    for(i=0;env[i];i++)
//    {
//        printf("env[%d]:%p\n",i,env[i]);
//    }
//
//    return 0;
//}
